﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Input</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/commands.css" rel="stylesheet" type="text/css">
<link href="../css/print.css" rel="stylesheet" type="text/css" media="print">
</head>
<body>

<h1>Input</h1>

<p>等待用户输入一个字符串 (不支持Windows 9x，在Windows 9x下它什么都不处理).</p>

<p class="CommandSyntax">Input [, OutputVar, Options, EndKeys, MatchList]</p>
<h3>参数 </h3>
<table border="1" width="100%" cellspacing="0" cellpadding="3" bordercolor="#C0C0C0">
  <tr> 
    <td width="15%"><p>OutputVar</p>    </td>
    <td width="85%"><p>用来保存用户输入文本的变量 (默认情况下，手工的输入也被保存下来)。</p>
      <p>如果这个参数和其他参数被省略，那么任何在其他 <a href="../misc/Threads.htm">thread</a> (线程)中执行的 Input 将被终止，终止后那个 Input 的 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 会被赋值为 NewInput。 而当前命令的 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 会被设置为 0 (如果它终止了一个先前的输入) 或 1 (如果它在先前没有终止输入)。</p>
      <p> <em>OutputVar</em> 本身并不记录击键，而是记录由活动窗口的 键盘布局/键盘语言 击键产生的字符。 所以，不产生字符的击键 (比如 PageUp 和 Escape) 并没有被记录下来。(尽管它们可以被下面的 <em>EndKeys</em> 参数识别出来)。</p>
      <p>空白字符会被逐个记录下来，比如 TAB (`t) 。 回车(ENTER)被记录为换行 (`n).</p></td>
  </tr>
  <tr>
    <td>Options</td>
    <td><p><u>由下列字母组成的字符串(零个，一个或者多个，可任意顺序，在中间的空格是可选的):</u></p>
      <p><strong>B</strong>: 忽略退格键。一般而言，按下退格键会删除最后一个输入的字符。 注意：如果输入的文本是可见的(比如在一个编辑器中)，用户在其中使用方向键或其他方式操纵了提示输入字符串的光标后，退格键依然会删除最后一个字符而不是光标前面的字符。</p>
      <p><strong>C</strong>: 区分大小写。一般而言，<em>MatchList</em> 并不区分大小写(在 1.0.43.03 版本之前, 只有字母 A-Z 被认为是有大小写的，而诸如 &uuml;/&Uuml; 的字母被认为没有).</p>
      <p><strong>I</strong>: 忽略所有由 AutoHotkey 脚本产生的字符，比如 <a href="Send.htm#SendEvent">SendEvent</a> 命令。然而，不论此选项是否开启，由 <a href="Send.htm#SendInput">SendInput</a> 和 <a href="Send.htm#SendPlay">SendPlay</a> 方法产生的输入总是被忽略。</p>      
      <p><strong>L</strong>: 限制文本长度(比如 L5)。设置输入文本所允许的最大长度。如果文本到达了这个长度，输入会被终止， <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 会被赋值为 Max 。但是如果文本和 <em>MatchList</em> 中某个词组符合的话， <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 会被赋值为 Match。如果这个选项没有开启，那么文本默认的长度是16383，这也是文本的绝对最大长度。</p>
      <p><strong>M</strong>: 如果修改过的从 Control-A 到 Control-Z 的击键对应于某个ASCII码的话，那么它就可以被识别并被转录。试试下面这个识别 Control-C 的例子：</p>
      <pre>Transform, CtrlC, Chr, 3 <em>; Store the character for Ctrl-C in the CtrlC var. </em>
Input, OutputVar, L1 M
if OutputVar = %CtrlC%
    MsgBox, You pressed Control-C.
ExitApp</pre>
      <p>注意：从 Ctrl-A 到 Ctrl-Z 的字符对应于 <a href="../Functions.htm#Chr">Chr(1)</a> 到 <a href="../Functions.htm#Chr">Chr(26)</a>。此 <strong>M </strong> 选项可能会导致一些快捷键在输入的过程中产生意料之外的效果(比如 Ctrl-LeftArrow )</p>
      <p><strong>T</strong>: 设置超时 (比如 T3)。 设置等待输入文本的秒数，到时后终止 Input 并将 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 赋值为 Timeout。如果 Input 超时， <em>OutputVar</em> 会被赋值为用户在超时以前输入的文本。这个参数可以被设为浮点数，比如 2.5。</p>      
      <p><strong><a name="vis"></a>V</strong>: 可见性。一般而言，用户的输入是阻塞的(隐藏在操作系统之后)。使用这个选项来发送用户的击键至活动窗口。</p>
      <p><strong><a name="asterisk"></a>*</strong>: 通配符(寻找所有地方)。一般而言，用户输入的文本必须完全匹配 <em>MatchList</em> 中的一个词组来产生一个匹配。使用这个选项来通过搜索完整长度的字符串来找到一个匹配。</p></td>
  </tr>
  <tr>
    <td>EndKeys</td>
    <td><p>按键的列表(零个，一个或者多个)，其中任何一个按下都会终止 Input 的输入。(<em>EndKey</em> 本身不会被写入 <em>OutputVar</em>)。但一个 Input 通过这种方式被终止后， <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 会被赋值为 EndKey 接一个 冒号 再接 <em>EndKey</em> 的值。例如：<br>
      EndKey:.<br>
      EndKey:Escape</p>
      <p>这个 <em>EndKey</em> 列表使用一种和 <a href="Send.htm">Send</a> 命令相仿的格式。比如，这个列表被设置为 {Enter}.{Esc} 后，按下 ENTER, 句号 (.), 或者 ESCAPE 之后都会终止输入。要使用大括号来终止输入，则需要将它们指定为 {{} 和/或 {}} 。</p>
      <p>如果想要使用 Control, Alt, 或者 Shift 来作为输入的终止键，则必须指出它是左边或者是右边的键，比如设置为 {LControl}{RControl} 而不是 {Control}。</p>
      <p>尽管譬如 Control-C (^c) 之类用做修改的键不被支持，一些需要 shift 键被按下的字符 -- 比如这些标点符号 ?!:@&amp;{} -- 已经在 1.0.14+ 的版本中被支持了。</p>
      <p>明确的虚拟键也可以被指定为输入的终止键，比如 {vkFF} 。这在一些罕见的情况下会很有用，比如一个键没有名字而且在按下的时候不产生可见的字符。这些虚拟键的键码可以通过 <a href="../KeyList.htm#SpecialKeys">key list page</a> 页面下方的步骤来确定。</p>
    </td>
  </tr>
  <tr>
    <td>MatchList</td>
    <td><p>一个由逗号分隔的关键词组的列表，其中的任何一个都可以终止一个输入 (在这种情况下 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 被赋值为 Match)。为了产生一个匹配，用户输入的文本必须完全匹配该列表中的某个词组 (除非 <a href="#asterisk">* 选项</a> 被选择)。另外， <strong>任何在分隔逗号旁边的空格或者跳格(tabs)都非常重要</strong>，这意味着它们也是匹配字符串中的一部分。例如，如果 <em>MatchList</em> 是 &quot;ABC , XYZ &quot;，那么用户在输入 ABC 后输入空格，或者在空格后输入 XYZ 都会产生一个匹配。</p>
      <p>两个连续的逗号在匹配词组中产生一个字面上的逗号。比如，下面的列表中，在第一个字符串的末尾会加上一个字面上的逗号： &quot;string1,,,string2&quot;。同样的，下面的列表中只包含一个内部有一个逗号的词组： &quot;single,,item&quot;。</p>
    <p>因为 <em>MatchList</em> 中的每一项并不是独立的参数，所以这个列表可以被全部包含在一个变量里。实际上，如果这个列表的长度超过了16383，那么它的部分或者全部就必须存储在一个变量里，因为16383是任何一个脚本一行中所能存储的最大长度。例如， <em>MatchList</em> 可以由 %List1%,%List2%,%List3% 组成 -- 而其中每一个变量中保存了用来匹配字符串的词组的一个大的子列表。</p>
    </td>
  </tr>
</table>

<h3>ErrorLevel</h3>
<table width="100%" border="1" cellpadding="3" cellspacing="0" bordercolor="#C0C0C0">
  <tr>
    <td width="15%"><p>1 or 0 </p></td>
    <td width="85%"><p>如果这个命令没有使用任何参数，那么 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 会被赋值为 0 (如果它成功终止了一个先前的输入) 或 1 (如果没有输入需要处理)。</p></td>
  </tr>
  <tr>
    <td>NewInput</td>
    <td>这个命令被另外一个使用 Input 命令的 <a href="../misc/Threads.htm">thread</a> (线程)所中断。</td>
  </tr>
  <tr>
    <td>Max</td>
    <td>输入达到了所允许的最大的字符串长度并且这个输入没有匹配到 <em>MatchList</em> 中的任何一项。</td>
  </tr>
  <tr>
    <td>Timeout</td>
    <td>输入超时。 </td>
  </tr>
  <tr>
    <td>Match</td>
    <td>输入和 <em>MatchList</em> 中的某一项匹配。</td>
  </tr>
  <tr>
    <td>EndKey:name</td>
    <td>任意一个用来终止 Input 的 <em>EndKeys</em> 被按下。在这种情况下， <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 会被设置为 EndKey 接一个 冒号 再接 EndKey 的值(不带大括号)，比如： EndKey:Enter, EndKey:Escape, 等等。</td>
  </tr>
</table>
<h3>注意</h3>
<p>如果在使用这个命令的时候，另外一个 <a href="../misc/Threads.htm">thread</a> (线程)中已经有一个 Input 在执行，那么那个线程中的 Input 会被终止且 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 会被赋值为 NewInput。在这之后(如果这个命令给出了参数)，新的 Input 命令才开始执行。</p>
<p>在一个 Input 执行的过程中，诸如 <a href="Menu.htm">custom menu items</a> 和 <a href="SetTimer.htm">timed subroutines</a> 之类的新的 <a href="../misc/Threads.htm">threads</a> (线程)依旧可以被创建。类似的，如果 Input 是 <a href="#vis">visible</a> (可见的)，键盘的 <a href="../Hotkeys.htm">hotkeys</a> 也依然有效。如果 Input 不可见，那就只有 <a href="_UseHook.htm">hook hotkeys</a> 可以被触发。</p>
<p>在一个脚本第一次使用这个命令时，<a href="_InstallKeybdHook.htm">keyboard hook</a> (键盘钩子)会被加载(如果它还没有加载)。另外，这个脚本会变成 <a href="_Persistent.htm">persistent</a> (持久的)，这意味着需要使用 <a href="ExitApp.htm">ExitApp</a> 来停止这个脚本。键盘钩子会保持加载状态直到下一次 <a href="Suspend.htm">Suspend</a> 或 <a href="Hotkey.htm">Hotkey</a> 命令的使用，到那时它就会被移除，除非其它的热键或热字符串仍然需要使用它。</p>
<p>如果您在使用多种语言或着多种键盘布局，那么 Input 会使用当前活动窗口的键盘布局而不是脚本所使用的(无论 Input 是否 <a href="#vis">visible</a> (可见))。但是，在 1.0.44.03 之前的版本中使用的是脚本所使用的布局。</p>
<p>一般情况下， <a href="../Hotstrings.htm">hotstrings</a> 比 Input 命令更容易使用，虽然它不是很灵活。</p>
<p><em>Input</em> 在  Windows 9x 下什么都不做。(连 ErrorLevel 和 <em>OutputVar</em> 也不改变)。如果要在 Windows 9x 下检测输入，请使用 <a href="../Variables.htm#OSType">A_OSType</a> 。</p>
<h3>相关命令</h3>
<p><a href="KeyWait.htm">KeyWait</a>, <a href="../Hotstrings.htm">Hotstrings</a>, <a href="InputBox.htm">InputBox</a>, <a href="_InstallKeybdHook.htm">#InstallKeybdHook</a>, <a href="../misc/Threads.htm">Threads</a>, <a href="IfIn.htm">if var in/contains MatchList</a></p>
<h3>示例</h3>
<pre class="NoIndent"><em>; Wait for the user to press any key.  Keys that produce no visible character -- such as</em>
<em>; the modifier keys, function keys, and arrow keys -- are listed as end keys so that they</em>
<em>; will be detected too.</em>
Input, SingleKey, L1, {LControl}{RControl}{LAlt}{RAlt}{LShift}{RShift}{LWin}{RWin}{AppsKey}{F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}{Left}{Right}{Up}{Down}{Home}{End}{PgUp}{PgDn}{Del}{Ins}{BS}{Capslock}{Numlock}{PrintScreen}{Pause}</pre>
<p>&nbsp;</p>
<pre class="NoIndent"><em>; This is a working hotkey example.  Since the hotkey has the tilde (~)</em>
<em>; prefix, its own keystroke will pass through to the active window</em>
<em>; (except on Win9x).  Thus, if you type [btw (or one of the other match</em>
<em>; phrases) in any editor, the script will automatically perform an</em>
<em>; action of your choice (such as replacing the typed text):</em>

~[::
Input, UserInput, V T5 L4 C, {enter}.{esc}{tab}, btw,otoh,fl,ahk,ca
if ErrorLevel = Max
{
    MsgBox, You entered &quot;%UserInput%&quot;, which is the maximum length of text.
    return
}
if ErrorLevel = Timeout
{
    MsgBox, You entered &quot;%UserInput%&quot; at which time the input timed out.
    return
}
if ErrorLevel = NewInput
    return
IfInString, ErrorLevel, EndKey:
{
    MsgBox, You entered &quot;%UserInput%&quot; and terminated the input with %ErrorLevel%.
    return
}
<em>; Otherwise, a match was found.</em>
SetKeyDelay, -1  <em>; Most editors can handle the fastest speed.</em>
if UserInput = btw
    Send, {backspace 4}by the way
else if UserInput = otoh
    Send, {backspace 5}on the other hand
else if UserInput = fl
    Send, {backspace 3}Florida
else if UserInput = ca
    Send, {backspace 3}California
else if UserInput = ahk
    Run, www.autohotkey.com
return</pre>

</body>
</html>
